home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
ww_tv.exe
/
TEDITOR1.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-24
|
21KB
|
698 lines
/*------------------------------------------------------------*/
/* filename - teditor1.cpp */
/* */
/* function(s) */
/* TEditor member functions */
/*------------------------------------------------------------*/
/*------------------------------------------------------------*/
/* */
/* Turbo Vision - Version 1.0 */
/* */
/* */
/* Copyright (c) 1991 by Borland International */
/* All Rights Reserved. */
/* */
/*------------------------------------------------------------*/
// Primatech Modification History:
//
// 11-07-91 JLS Changed constructor to initialize new data fields
// 11-26-91 JLS Added break after evCommand case in handleEvent()
// 12-02-91 JLS Changed cmDelChar processing so that a soft return is
// not deleted, just skipped.
// 02-18-92 JLS Changed handleEvent() so that it doesn't unconditionally
// clear an event after an cmScrollBarChanged broadcast.
// 08-24-92 JLS Updated previous fix to verify that one of my scrollbars
// is affected before calling checkScrollBar()
#define Uses_TRect
#define Uses_TKeys
#define Uses_TEditor
#define Uses_TIndicator
#define Uses_TEvent
#define Uses_TScrollBar
#define Uses_TFindDialogRec
#define Uses_TReplaceDialogRec
#define Uses_opstream
#define Uses_ipstream
#include <tv.h>
#if !defined( __STRING_H )
#include <string.h>
#endif // __STRING_H
#if !defined( __CTYPE_H )
#include <ctype.h>
#endif // __CTYPE_H
#if !defined( __DOS_H )
#include <Dos.h>
#endif // __DOS_H
inline int isWordChar( int ch )
{
return isalnum(ch) || ch == '_';
}
const ushort firstKeys[] =
{
38,
kbCtrlA, cmWordLeft,
kbCtrlC, cmPageDown,
kbCtrlD, cmCharRight,
kbCtrlE, cmLineUp,
kbCtrlF, cmWordRight,
kbCtrlG, cmDelChar,
kbCtrlH, cmBackSpace,
kbCtrlK, 0xFF02,
kbCtrlL, cmSearchAgain,
kbCtrlM, cmNewLine,
kbCtrlO, cmIndentMode,
kbCtrlQ, 0xFF01,
kbCtrlR, cmPageUp,
kbCtrlS, cmCharLeft,
kbCtrlT, cmDelWord,
kbCtrlU, cmUndo,
kbCtrlV, cmInsMode,
kbCtrlW, cmToggleWrap,
kbCtrlX, cmLineDown,
kbCtrlY, cmDelLine,
kbLeft, cmCharLeft,
kbRight, cmCharRight,
kbCtrlLeft, cmWordLeft,
kbCtrlRight, cmWordRight,
kbHome, cmLineStart,
kbEnd, cmLineEnd,
kbUp, cmLineUp,
kbDown, cmLineDown,
kbPgUp, cmPageUp,
kbPgDn, cmPageDown,
kbCtrlPgUp, cmTextStart,
kbCtrlPgDn, cmTextEnd,
kbCtrlHome, cmWindowStart,
kbCtrlEnd, cmWindowEnd,
kbIns, cmInsMode,
kbDel, cmDelChar,
kbShiftIns, cmPaste,
kbShiftDel, cmCut,
kbCtrlIns, cmCopy,
kbCtrlDel, cmClear
};
const ushort quickKeys[] =
{ 8,
'A', cmReplace,
'C', cmTextEnd,
'D', cmLineEnd,
'F', cmFind,
'H', cmDelStart,
'R', cmTextStart,
'S', cmLineStart,
'Y', cmDelEnd
};
const ushort blockKeys[] =
{ 5,
'B', cmStartSelect,
'C', cmPaste,
'H', cmHideSelect,
'K', cmCopy,
'Y', cmCut
};
const ushort *keyMap[] = { firstKeys, quickKeys, blockKeys };
ushort defEditorDialog( int, ... );
#pragma warn -asc
ushort scanKeyMap( const void *keyMap, int keyCode )
{
asm {
PUSH DS
LDS SI,keyMap
MOV DX,keyCode
CLD
LODSW
MOV CX,AX
}
__1:
asm {
LODSW
MOV BX,AX
LODSW
CMP BL,DL
JNE __3
OR BH,BH
JE __4
CMP BH,DH
JE __4
}
__3:
asm {
LOOP __1
XOR AX,AX
}
__4:
asm POP DS
return _AX;
}
#pragma warn .asc
#define cpEditor "\x06\x07"
TEditor::TEditor( const TRect& bounds,
TScrollBar *aHScrollBar,
TScrollBar *aVScrollBar,
TIndicator *aIndicator,
ushort aBufSize ) :
TEditorBase( bounds ),
hScrollBar( aHScrollBar ),
vScrollBar( aVScrollBar ),
indicator( aIndicator ),
bufSize( aBufSize ),
canUndo( True ),
selecting( False ),
overwrite( False ),
autoIndent( False ),
lockCount( 0 ),
keyState( 0 ),
wordWrap( False ),
autosizeMargin( False ),
rMargin( bounds.b.x - bounds.a.x - 1),
tabSize( 4 ),
retChar(' ')
{
growMode = gfGrowHiX | gfGrowHiY;
options |= ofSelectable;
eventMask = evMouseDown | evKeyDown | evCommand | evBroadcast;
showCursor();
initBuffer();
if( buffer != 0 )
isValid = True;
else
{
editorDialog( edOutOfMemory );
bufSize = 0;
isValid = False;
}
setBufLen(0);
}
TEditor::~TEditor()
{
}
void TEditor::shutDown()
{
doneBuffer();
TEditorBase::shutDown();
}
void TEditor::changeBounds( const TRect& bounds )
{
lock();
setBounds(bounds);
delta.x = max(0, min(delta.x, limit.x - size.x));
delta.y = max(0, min(delta.y, limit.y - size.y));
if (autosizeMargin) {
ushort oldMargin = rMargin;
rMargin = bounds.b.x - bounds.a.x - 1;
if (wordWrap && oldMargin != rMargin) {
wordWrapBuffer(0, bufLen);
}
}
update(ufView);
unlock();
}
// 11-11-91 JLS Added code for variable tab size
int TEditor::charPos( ushort p, ushort target )
{
int pos = 0;
while( p < target )
{
if( bufChar(p) == '\t' )
{
pos += (tabSize - (pos % tabSize));
}
else
pos++;
p++;
}
return pos;
}
// 11-11-91 JLS Added code for variable tab size
ushort TEditor::charPtr( ushort p, int target )
{
int pos = 0;
char ch;
while( (pos < target) && (p < bufLen) && (ch = bufChar(p)) != '\x0D' )
{
if( ch == '\t' ) // TAB
{
pos += (tabSize - (pos % tabSize));
}
else
pos++;
p++;
}
if( pos > target )
p--;
return p;
}
Boolean TEditor::clipCopy()
{
Boolean res = False;
if( (clipboard != 0) && (clipboard != this) )
{
res = clipboard->insertFrom(this);
selecting = False;
update(ufUpdate);
}
return res;
}
void TEditor::clipCut()
{
if( clipCopy() == True )
deleteSelect();
}
void TEditor::clipPaste()
{
if( (clipboard != 0) && (clipboard != this) )
insertFrom(clipboard);
}
void TEditor::convertEvent( TEvent& event )
{
if( event.what == evKeyDown )
{
if( (event.shiftState & (kbRightShift | kbLeftShift)) != 0 &&
event.keyDown.charScan.scanCode >= 0x47 &&
event.keyDown.charScan.scanCode <= 0x51
)
event.keyDown.charScan.charCode = 0;
ushort key = event.keyDown.keyCode;
if( keyState != 0 )
{
if( (key & 0xFF) >= 0x01 && (key & 0xFF) <= 0x1A )
key += 0x40;
if( (key & 0xFF) >= 0x61 && (key & 0xFF) <= 0x7A )
key -= 0x20;
}
key = scanKeyMap(keyMap[keyState], key);
keyState = 0;
if( key != 0 )
if( (key & 0xFF00) == 0xFF00 )
{
keyState = (key & 0xFF);
clearEvent(event);
}
else
{
event.what = evCommand;
event.message.command = key;
}
}
}
Boolean TEditor::cursorVisible()
{
return Boolean((curPos.y >= delta.y) && (curPos.y < delta.y + size.y));
}